// 引入了模块
let express = require('express')();
let mysql = require('mysql');
let url = require('url');
let fs = require('fs');
let expressStatic = require('express-static');
//定义一个端口
const port = 80;

var sql = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: '123456',
    database: 'student',
    timezone: "08:00"
});
//尝试连接数据库
sql.connect();

// 计划一个服务于客户端的接口
express.get("/", (Request, response) => {
    // 这个回调函数是只有我们后端接收到来自前端的请求时会执行的。
    // 作为后端 向 前端返回一段内容
    // response.end('success!!!!!!')
    // 在后台控制台中输出
    // console.log(`接收到来自客户端的请求，这是第${++count}处理请求`)
    fs.readFile("static/students.html", (error, data) => {
        if (error) {
            response.end("error")
            // console.log("找不到文件");
        } else {
            response.end(data)
            // console.log("已找到");
        }
    })
})

express.get("/set", (Request, response) => {
    //Request包含了客户端的一些信息,要用到response中的url属性
    //url模块中的一个parse()方法，里面接收的值是（路由）即是路径，输出url.parse(request.url, true)是一个Url对象,里面有四个可用的属性值我query,pathname,path,href属性，输出结果中的query属性的属性值是一个对象，里面包含了路径，你想要query路由下的那个属性值，点上那个属性名即可。若是callback就是前段希望之星的那个函数。
    // let callback = url.parse(Request.url, true).query.callback;
    // 查询数据库
    sql.query(`SELECT * FROM students`, (error, data) => {
        if (error) {
            //使用了response的send或end方法，以后常用
            response.end("database error");
            console.log("数据库查找失败了")
        } else {
            // 反解析后向前端返回JSON字符串
            response.end(JSON.stringify(data))
            // console.log("数据库查询成功了!");
        }
    })
})
//添加
express.get("/add", (request, response) => {
    let name = url.parse(request.url, true).query.name;
    let sex = url.parse(request.url, true).query.sex;
    let age = url.parse(request.url, true).query.age;
    let city = url.parse(request.url, true).query.city;
    sql.query(`INSERT INTO students (name,sex,age,city) VALUES ("${name}","${sex}","${age}","${city}")`, (error, data) => {
        if (error) {
            response.end("database error");
            console.log(`${name}添加失败`);
        } else {
            response.end("成功");
            console.log("添加成功");
        }
    })
})
//修改
express.get("/update", (request, response) => {
    let name = url.parse(request.url, true).query.name;
    let sex = url.parse(request.url, true).query.sex;
    let age = url.parse(request.url, true).query.age;
    let city = url.parse(request.url, true).query.city;
    let id = url.parse(request.url, true).query.id;
    sql.query(`UPDATE students SET name='${name}',sex='${sex}',city='${city}',age='${age}' WHERE id='${id}'`, (error, data) => {
        if (error) {
            response.end("database error");
            console.log(`${id}修改失败`);
        } else {
            response.end("成功");
            console.log("修改成功");
        }
    })
})
//删除
express.get("/delete", (Request, response) => {
    //Request包含了客户端的一些信息,要用到response中的url属性
    //url模块中的一个parse()方法，里面接收的值是路由即是路径，输出url.parse(request.url, true)是一个Url对象,里面有四个可用的属性值我query,pathname,path,href属性，输出结果中的query属性的属性值是一个对象，里面包含了路径，你想要query路由下的那个属性值，点上那个属性名即可。若是callback就是前端请求的的那个回调函数。
    // let callback = url.parse(Request.url, true).query.callback;
    //删除根据id去删除，所有要获取id参数
    let id = url.parse(Request.url, true).query.id;
    if (id === undefined) {
        response.end("还没有发送要删除的学员id")
    } else {
        // 查询数据库
        sql.query(`DELETE FROM students WHERE id=${id}`, (error, data) => {
            if (error) {
                //使用了response的send或end方法，以后常用
                response.end("database error");
                console.log("数据库查找失败了")
            } else {
                // 反解析后向前端返回JSON字符串
                response.end("success")
                console.log("数据库查询成功了!");
            }
        })
    }
})
//注册
express.get("/reg", (request, response) => {
    let username = url.parse(request.url, true).query.username;
    let password = url.parse(request.url, true).query.password;
    // 查询数据库
    sql.query(`SELECT * FROM login WHERE username='${username}'`, (error, data) => {
        if (error) {
            response.end("database error");
            console.log(`${username} 注册失败`)
        } else {
            if (!data[0]) {
                console.log("该用户名可以注册");
                sql.query(`INSERT INTO login (username,password) VALUES ("${username}","${password}")`, (error, data) => {
                    if (error) {
                        //使用了response的send或end方法，以后常用
                        response.end("database error");
                        console.log(`${username} 注册失败`)
                    } else {
                        response.end("success")
                        console.log("注册成功");
                    }
                })
            } else {
                response.end("该用户名已注册");
                console.log("该用户名已注册");
            }
        }

    })
})
//登录
express.get("/login", (request, response) => {
    let username = url.parse(request.url, true).query.username;
    let password = url.parse(request.url, true).query.password;
    //判断username和password是否有文本
    if (username && password) {
        sql.query(`SELECT * FROM login WHERE username="${username}" AND password="${password}"`, (error, data) => {
            if (data.length) {
                response.end(String(data[0].username))
                console.log(`用户:${data[0].username}登录成功。`)
            } else {
                response.end("error")
            }
        })
    } else {
        //如果有任何一个为空，返回error
        response.end("error")
    }
})
//成绩管理
express.get("/score", (request, response) => {
    let studentId = url.parse(request.url, true).query.id;
    let name = url.parse(request.url, true).query.name;
    let date = url.parse(request.url, true).query.date;
    let subject = url.parse(request.url, true).query.subject;
    if (subject && name) {
        sql.query(`select * from students,score where students.id=score.studentId and students.name="${name}" and score.subject="${subject}"`, (error, data) => {
            response.end(JSON.stringify(data))
        })
    }
    //满足姓名和考试日期
    if (name && date) {
        sql.query(`select * from students,score where students.id=score.studentId and students.name="${name}" AND score.date="${date}"`, (error, data) => {
            response.end(JSON.stringify(data))
        })
    }
    // //只满足姓名
    if (name) {
        sql.query(`select * from students,score where students.id=score.studentId and students.name="${name}"`, (error, data) => {
            response.end(JSON.stringify(data))
        })
    }
    if (studentId) {
        sql.query(`select * from students,score where students.id=score.studentId and students.id="${studentId}"`, (error, data) => {
            response.end(JSON.stringify(data))
        })
    }
    //什么都没有点查询
    if (!studentId && !name) {
        sql.query(`select * from students,score where score.studentId = students.id ORDER BY students.id`, (error, data) => {
            response.end(JSON.stringify(data))
        })
    }
})
express.use(expressStatic(`${__dirname}/static`))

// 开始监听来自前端的请求， 也叫启动服务
// 这个操作不会停止
express.listen(port, () => {
    console.log(`server is running at ${port}`)
})